class Solution {
public:
    //前缀和
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int>map;
        map[0]=1;//防止i为0时满足:单个元素和为k，需要加次数，初值设1表示存在次数。

        int prefixSum=0;//和项
        int count=0;//返回个数

        //O(N)
        for(int j=0;j<nums.size();++j)
        {
            prefixSum+=nums[j];
            int diff=prefixSum-k;//前i-1项和 diff==prefixSum[i-1]
            //prefixSum[j]-prefixSum[i-1]=k     子数组区间和
            count+=map[diff];//前面的项和若在map中，则表示出现过，也就是当前i,j区间有和为k，若没出现过，则键的初始值是0
            map[prefixSum]++;//记录出现的项和
        }
        return count;
    }
};